// stores/counter.js
import {
  defineStore
} from 'pinia';

export const useCounterStore = defineStore('counter', {
  state: () => {
    return {
      // 购物车的数组，用来存储购物车中每个商品的信息对象
      // 每个商品的信息对象，都包含如下 6 个属性：
      // { goods_id, goods_name, goods_price, goods_count,goods_small_logo, goods_state }
      cart: JSON.parse(uni.getStorageSync('cart') || '[]')
    };
  },
  // 当 getter 依赖的 state 数据发生变化时，getter 会自动重新执行。
  getters: {
    total: (state) => {
      // sum为累计器 goods为当前正在处理的值
      return state.cart.reduce((sum, goods) => sum + goods.goods_count, 0)
    },
    // 勾选的商品的总数量
    checkedCount(state) {
      // 先使用 filter 方法，从购物车中过滤器已勾选的商品
      // 再使用 reduce 方法，将已勾选的商品总数量进行累加
      // reduce() 的返回值就是已勾选的商品的总数量
      return state.cart.filter(x => x.goods_state).reduce((total, item) => total += item.goods_count, 0)
    },
    // 已勾选的商品的总价
    checkedGoodsAmount(state) {
      // 先使用 filter 方法，从购物车中过滤器已勾选的商品
      // 再使用 reduce 方法，将已勾选的商品数量 * 单价之后，进行累加
      // reduce() 的返回值就是已勾选的商品的总价
      // 最后调用 toFixed(2) 方法，保留两位小数
      return state.cart.filter(x => x.goods_state)
        .reduce((total, item) => total += item.goods_count * item.goods_price, 0)
        .toFixed(2)
    }
  },
  actions: {
    // 添加到购物车
    addToCart(goods) {
      const findResult = this.cart.find(x => x.goods_id == goods.goods_id)
      if (!findResult) {
        // 没找到就push进去
        this.cart.push(goods)
      } else {
        // 找到了 返回数组中对应那条的 修改返回值会影响原数组 （数组是引用类型）
        findResult.goods_count++
      }
      uni.setStorageSync('cart', JSON.stringify(this.cart))
    },
    // 更新购物车中商品的勾选状态
    updateGoodsState(goods) {
      // 根据 goods_id 查询购物车中对应商品的信息对象
      const findResult = this.cart.find(x => x.goods_id == goods.goods_id)
      // 有对应的商品信息对象
      if (findResult) {
        // 更新对应商品的勾选状态
        findResult.goods_state = goods.goods_state
        // 持久化存储到本地
        uni.setStorageSync('cart', JSON.stringify(this.cart))
      }
    },
    // 更新购物车中商品的数量
    updateGoodsCount(goods) {
      // 根据 goods_id 查询购物车中对应商品的信息对象
      const findResult = this.cart.find(x => x.goods_id == goods.goods_id)
      if (findResult) {
        // 更新对应商品的数量
        findResult.goods_count = goods.goods_count
        // 持久化存储到本地
        uni.setStorageSync('cart', JSON.stringify(this.cart))
      }
    },
    // 根据 Id 从购物车中删除对应的商品信息
    removeGoodsById(goods_id) {
      // 调用数组的 filter 方法进行过滤
      this.cart = this.cart.filter(x => x.goods_id !== goods_id)
      // 持久化存储到本地
      uni.setStorageSync('cart', JSON.stringify(this.cart))
    },
    // 更新所有商品的勾选状态
    updateAllGoodsState(newState) {
      // 循环更新购物车中每件商品的勾选状态
      this.cart.forEach(x => x.goods_state = newState)
      // 持久化存储到本地
      uni.setStorageSync('cart', JSON.stringify(this.cart))
    },
  },
});

export const userAdressStore = defineStore('userAdress', {
  state: () => {
    return {
      // 收货地址
      address: JSON.parse(uni.getStorageSync('address') || '{}'),
      // 登录成功之后的 token 字符串
      token: uni.getStorageSync('token') || '',
      // 用户的基本信息
      userinfo: JSON.parse(uni.getStorageSync('userinfo') || '{}'),
      // 重定向的 object 对象 { openType, from }
      redirectInfo: null
    };
  },
  // 当 getter 依赖的 state 数据发生变化时，getter 会自动重新执行。
  getters: {
    // 收货详细地址的计算属性
    addstr(state) {
      if (!state.address.provinceName) return ''
      // 拼接 省，市，区，详细地址 的字符串并返回给用户
      return state.address.provinceName + state.address.cityName +
        state.address.countyName + state.address.detailInfo
    }
  },
  actions: {
    // 更新收货地址
    updateAddress(address) {
      // 更新Pinia 的 state.address
      this.address = address;
      uni.setStorageSync('address', JSON.stringify(address))
    },
    // 更新用户的基本信息
    updateUserInfo(userinfo) {
      this.userinfo = userinfo
      uni.setStorageSync('userinfo', JSON.stringify(this.userinfo))
    },
    // 更新 token 字符串
    updateToken(token) {
      this.token = token
      uni.setStorageSync('token', JSON.stringify(this.token))
    },
    // 更新重定向的信息对象
    updateRedirectInfo(info) {
      this.redirectInfo = info
    }
  },
});